<?php

/**
 * CHECK REFERER
 * 
 * Función que chequea si se accedió al sitio a través de un referido.
 * Si viene de un referido se verifica a que estrategia pertenece y se valida si dicha estrategia
 * se encuentra aún activa para insertar la visita como operación en la base de datos.
 * Si no existe estrategia activa sólo se registra la visita pero no genera ningún beneficio para 
 * el usuario al que se están refiriendo.
 * Si se encuentra mas de una estrategia, se toma la ultima creada.
 * 
 */

require_once '../bootstrap.php';
require_once 'entities/User.php';
require_once 'entities/Visit.php';
require_once 'entities/Media.php';
require_once 'entities/Domain.php';
require_once 'entities/ItemDomain.php';
require_once 'entities/Strategy.php';
require_once 'entities/Fare.php';
require_once 'entities/Operation.php';

checkReferer( $entityManager );

function checkReferer( $entityManager ) {
  
  if ( isset( $_GET['refcode'] ) && ( $_GET['refcode'] > 0 ) ) {
    
    // Validar que existe el usuario con ese refcode
    $userRef = $entityManager->getRepository( 'User' )->findOneBy( array( 'usuReferenceCode' => $_GET['refcode'] ) );

    if ($userRef) {
      
      // Validar que no haya entrado ya por esa ip
      $query = $entityManager->createQuery('SELECT COUNT(v.visId) FROM Visit v
                                            WHERE v.visUsuId = :vis_usu_id AND v.visIp = :vis_ip');
      $query->setParameters(array(
          'vis_usu_id' => $userRef->getUsuId(),
          'vis_ip' => $_SERVER['REMOTE_ADDR'],
      ));

      $result = $query->getSingleScalarResult();

      if ( $result == 0 ) {
        $visit = new Visit();

        $visit->setVisUsuId( $userRef->getUsuId() );
        //$visit->setVisIp( $_SERVER['REMOTE_ADDR'] );
        $visit->setVisIp( rand(0, 255) . "." . rand(0, 255) . "." . rand(0, 255) . "." . rand(0, 255) );
        $visit->setVisAuditDate( time() );
        if( isset( $_SERVER['HTTP_REFERER'] ) ) {
          $visit->setVisUrlFrom( $_SERVER['HTTP_REFERER'] );
        }else{
          $visit->setVisUrlFrom( "Private" );
        }
        
        // Si tiene estrategia valido que exista y que este activa
        if( isset( $_GET['str'] ) && ( $_GET['str'] > 0 ) ){        
          $strategy = getActiveStrategy($entityManager, $_GET['str']);
        }
        
        if( $strategy ) {
          $visit->setVisStr( $strategy );
        }
        
        $entityManager->persist( $visit );
        $entityManager->flush();
              
        
        // Si tiene estrategia valido que exista y que este activa
        if( ( $strategy ) && ( $strategy->getStrValidityStart() < time() ) && ( $strategy->getStrValidityEnd() > time() ) ){

          // Obtengo el referal_amount de la estrategia
          $fare = $entityManager->getRepository('Fare')->findOneBy( array( 'farId' => $strategy->getStrFar() ) );

          if( $fare !== NULL ){ 
                         
            $status = $entityManager->getRepository('ItemDomain')->findOneBy( array( 'itdId' => 3 ) );
                            
            $operation = new Operation();
              
            $operation->setOpeUsu( $userRef );
            $operation->setOpeTraId( 1567 );
            $operation->setOpeType( 1 ); //TODO: ver que hacemos con este campo
            $operation->setOpeStatus( $status ); // not paid
            $operation->setOpeVis( $visit );
            $operation->setOpeReferalAmount( $fare->getFarAmount() );
            $operation->setOpeStr( $strategy );
            $operation->setOpeAuditCreateDate( time() );

            $entityManager->persist( $operation );
            $entityManager->flush();           
          }
        }
      }
    }
  }
}

function getActiveStrategy($entityManager, $str) {
    // Obtengo los datos de la estrategia
    $strategy = $entityManager->find('Strategy', $str);
    
    if( ( $strategy ) && ( $strategy->getStrValidityStart() < time() ) && ( $strategy->getStrValidityEnd() > time() ) ){
      return $strategy;
    }else{
      return false;
    }
}